import fs from 'fs-extra';
import path from 'path';
import {ProjectScanResult, ProjectSimpleTree} from '../types';
import {FormatUtil} from '../utils/FormatUtil';

// 扩展ProjectSimpleTree，临时项目类型适配
interface ProjectDetail extends ProjectSimpleTree {
  // 可选的size属性
  size?: number;
  // 可选的fileCount属性
  fileCount?: number;
  // 可选的directoryCount属性
  directoryCount?: number;
  // npm项目信息
  npm?: {
    version: string;
    dependencies: any[];
    devDependencies: any[];
  };
  // java项目信息
  java?: {
    groupId?: string;
    artifactId?: string;
    version?: string;
    dependencies: any[];
  };
}

/**
 * 生成扫描报告
 */
export async function generateReport(
  scanResult: ProjectScanResult,
  outputPath: string
): Promise<void> {
  try {
    // 确保输出目录存在
    await fs.ensureDir(path.dirname(outputPath));

    // 保存原始扫描结果为 JSON 文件
    await fs.writeJSON(outputPath, scanResult, {spaces: 2});

    // 如果路径没有 .json 扩展名，则自动添加
    if (!outputPath.endsWith('.json')) {
      outputPath += '.json';
    }

    // 可选: 生成人类可读的文本摘要报告
    const summaryPath = outputPath.replace(/\.json$/, '-summary.txt');
    await generateSummaryReport(scanResult, summaryPath);
  } catch (error) {
    throw new Error(`生成报告失败: ${error}`);
  }
}

/**
 * 生成摘要报告
 */
async function generateSummaryReport(
  scanResult: ProjectScanResult,
  outputPath: string
): Promise<void> {
  try {
    const {projects, rootPath, timestamp} = scanResult;

    // 估算总大小（可能需要根据实际情况计算）
    const totalSize = 0; // 这里可以根据实际需求添加计算逻辑

    // 创建报告内容
    let content = '';

    // 标题和基本信息
    content += '=======================================\n';
    content += '             项目扫描报告              \n';
    content += '=======================================\n\n';

    content += `扫描时间: ${new Date(timestamp).toLocaleString()}\n`;
    content += `扫描目录: ${rootPath}\n`;
    content += `项目数量: ${projects.length}\n\n`;

    // 项目列表
    content += '=======================================\n';
    content += '              项目列表                \n';
    content += '=======================================\n\n';

    // 将项目转换为ProjectDetail类型进行处理
    const detailedProjects = projects as ProjectDetail[];

    // 尝试按项目大小排序（如果有size属性）
    const sortedProjects = [...detailedProjects].sort((a, b) => {
      // 如果没有size属性，则保持原顺序
      if (a.size === undefined || b.size === undefined) return 0;
      return b.size - a.size;
    });

    for (const project of sortedProjects) {
      content += `项目名称: ${project.name}\n`;
      content += `路径: ${project.path}\n`;
      content += `类型: ${project.type}\n`;

      // 如果存在size属性则显示
      if (project.size !== undefined) {
        content += `大小: ${FormatUtil.formatFileSize(project.size)}\n`;
      }

      // 如果存在fileCount属性则显示
      if (project.fileCount !== undefined) {
        content += `文件数: ${project.fileCount}\n`;
      }

      // 如果存在directoryCount属性则显示
      if (project.directoryCount !== undefined) {
        content += `目录数: ${project.directoryCount}\n`;
      }

      // 根据项目类型添加特定信息
      if (project.npm) {
        content += `版本: ${project.npm.version}\n`;
        content += `依赖数: ${project.npm.dependencies.length}\n`;
        content += `开发依赖数: ${project.npm.devDependencies.length}\n`;
      } else if (project.java) {
        if (project.java.groupId) content += `组ID: ${project.java.groupId}\n`;
        if (project.java.artifactId) content += `构件ID: ${project.java.artifactId}\n`;
        if (project.java.version) content += `版本: ${project.java.version}\n`;
        content += `依赖数: ${project.java.dependencies.length}\n`;
      }

      content += '\n';
    }

    // 写入摘要文件
    await fs.writeFile(outputPath, content, 'utf-8');
  } catch (error) {
    console.error(`生成摘要报告失败: ${error}`);
  }
}
